/***********************************************************************************
 * @ file    : imi_camera_cli.h
 * @ author  : yang yang
 * @ version : 0.9
 * @ date    : 2021.09.20
 * @ brief   :
 * @Copyright (c) 2016  chuangmi inc.
 ************************************************************************************/

#ifndef __IMI_CAMERA_CLI_H__
#define __IMI_CAMERA_CLI_H__

typedef struct imi_camera_cli_s *imi_camera_cli_t;

//-------------------------------------------------------------------------------------
// 客户端事件
//-------------------------------------------------------------------------------------
typedef enum {
    CLI_CAM_EVT_CLOSED       = 0,
    CLI_CAM_EVT_CONNECTING   = 1,
    CLI_CAM_EVT_LOGINING     = 2,
    CLI_CAM_EVT_CONNECTED    = 3,
    CLI_CAM_EVT_DISCONNECTED = 4,

    CLI_CAM_EVT_LOGIN_FAILED = 11,
} imi_camera_cli_event_t;

//-------------------------------------------------------------------------------------
// 媒体数据回调
// @cli             客户端实例
// @frame_idx       发送数据时系统自动附带的帧号，可以用于判断帧序
// @frame_info      帧头信息
// @info_len        收到的帧头信息长度
// @data            收到的数据指针
// @len             收到的数据长度
// @userdata        注册时传入的userdata
//-------------------------------------------------------------------------------------
typedef void (*func_camera_cli_media_handler)(
    imi_camera_cli_t cli,
    int frame_idx,
    int frame_type,
    const char* frame_info,
    int info_len,
    const char* data,
    int len,
    void* userdata);

//-------------------------------------------------------------------------------------
// 控制指令回调
// @cli             客户端实例
// @msg_idx         发送数据时系统自动附带的帧号，可以用于判断消息序
// @msg             收到的消息指针
// @msg_len         收到的消息长度
// @userdata        注册时传入的userdata
//-------------------------------------------------------------------------------------
typedef void (*func_camera_cli_msg_handler)(
    imi_camera_cli_t cli,
    const char* msg,
    int msg_len,
    void* userdata);


//-------------------------------------------------------------------------------------
// 客户端事件回调
// @cli             客户端实例
// @evt:            事件类型
// @param:          事件对应的参数（不同的事件有不同的结构体）
// @userdata:       注册时传入的userdata
//-------------------------------------------------------------------------------------
typedef void (*func_camera_cli_event_handler)(
    imi_camera_cli_t cli,
    imi_camera_cli_event_t evt,
    void* param,
    void* userdata);


#ifdef __cplusplus
extern "C" {
#endif

    //-------------------------------------------------------------------------------------
    // 创建客户端实例
    // @return          创建好的客户端实例
    //-------------------------------------------------------------------------------------
    imi_camera_cli_t imi_camera_cli_create();


    //-------------------------------------------------------------------------------------
    // 创建客户端实例
    // @cli:            客户端实例
    //-------------------------------------------------------------------------------------
    void imi_camera_cli_release(imi_camera_cli_t cli);


    //-------------------------------------------------------------------------------------
    // 设置服务回调
    // @cli:            客户端实例
    // @msg_cb:         控制指令回调
    // @media_cb:       媒体数据回调
    // @evt_cb          事件回调
    // @userdata:       userdata，回调时会把该值传回
    //-------------------------------------------------------------------------------------
    void imi_camera_cli_set_callback(
        imi_camera_cli_t cli,
        func_camera_cli_msg_handler msg_cb,
        func_camera_cli_media_handler media_cb,
        func_camera_cli_event_handler evt_cb,
        void *userdata);

    //-------------------------------------------------------------------------------------
    // 连接服务, 异步连接。通过回调通知连接状态
    // @cli             客户端实例
    // @ip              服务ip
    // @media_port      服务媒体端口
    // @control_port    指令端口
    // @device_id       设备id. 当断线重连后，服务端会根据device id匹配登录客户端
    // @token           登录密钥
    // @return          0：成功，其他错误编码
    //-------------------------------------------------------------------------------------
    int imi_camera_cli_connect(imi_camera_cli_t cli, char* ip, int media_port,
        int control_port, char* deivce_id, char* token);

    //-------------------------------------------------------------------------------------
    // 断开连接
    // @cli             客户端实例
    // @return          0：成功，其他错误编码
    //-------------------------------------------------------------------------------------
    int imi_camera_cli_disconnect(imi_camera_cli_t cli);

    //-------------------------------------------------------------------------------------
    // 发送媒体数据
    // @cli             客户端实例
    // @frame_type      发送的帧类型，可以自行约定。
    // @frame_info      要发送的音视频帧信息
    // @info_len        帧信息长度
    // @data            要发送的音视帧数据
    // @len             要发送的音视频数据长度
    // @return          0：成功，其他错误编码
    //-------------------------------------------------------------------------------------
    int imi_camera_cli_send_media(
        imi_camera_cli_t cli,
        int frame_type,
        const char* frame_info,
        int info_len,
        const char* data,
        int len);

    //-------------------------------------------------------------------------------------
    // 发送消息数据
    // @cli             客户端实例
    // @message         要发送消息信息
    // @len             消息信息长度
    // @return          0：成功，其他错误编码
    //-------------------------------------------------------------------------------------
    int imi_camera_cli_send(
        imi_camera_cli_t cli,
        const char* message,
        int len);

#ifdef __cplusplus
}
#endif

#endif // __IMI_CAMERA_SVC_H__
